<?php
namespace EmailDelivery;

use Pinenut\Model2\Finder;

/**
 * Реестр времени последней отправки
 * Служит для проверки необходимости отправить
 * письмо по тому-же событию, например
 *
 * @author kosh
 *        
 */
class LastSentRegistry extends \Model {

	/**
	 * Тип сообщения (Свободная строка, на откуп используемой стороне)
	 *
	 * @var string
	 */
	public $type;

	/**
	 * В общем смысле идентификатор получателя
	 *
	 * @var string
	 */
	public $receiver;

	/**
	 * время отправки
	 *
	 * @var Integer
	 */
	public $time;

	public static function fields( ) {
		return array_merge(parent::fields(), 
			[
				'type' => self::STRING,
				'receiver' => self::STRING,
				'time' => self::DATE
			]);
	}

	function indexes( ) {
		return array_merge(parent::indexes(), 
			[
				'receiver_type' => [
					'receiver' => Finder::ORDER_ASC,
					'type' => Finder::ORDER_ASC
				]
			]);
	}

	/**
	 * Отмечаем в реестре время отправки 
	 * @param string $type
	 * @param string $receiver
	 */
	public static function mark($type, $receiver) {
		if (! ($record = static::get($type, $receiver))) {
			$record = new static();
			$record->type = $type;
			$record->receiver = $receiver;
		}
		$record->set('time', time());
		$record->save();
	}

	/**
	 * Возвращаем время последней отправки для проверки
	 * 
	 * @param string $type
	 * @param string $receiver
	 * @return null|integer
	 */
	public static function check($type, $receiver) {
		if ($record = static::get($type, $receiver)) {
			return $record->time;
		}
	}

	/**
	 * Ищем запись
	 *
	 * @param string $type
	 * @param string $receiver
	 * @return Ambigous <\Pinenut\Model2\static, multitype:, NULL, mixed>
	 */
	protected static function get($type, $receiver) {
		return static::find()
		->where('receiver', $receiver)
		->where('type', $type)
		->one();
	}
	
}